package pe.gob.mininter.dirandro.vaadin.panel.parte;

import java.math.BigDecimal;
import java.text.MessageFormat;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import pe.gob.mininter.dirandro.model.DetPerInmExp;
import pe.gob.mininter.dirandro.model.Expediente;
import pe.gob.mininter.dirandro.model.Inmueble;
import pe.gob.mininter.dirandro.model.Persona;
import pe.gob.mininter.dirandro.model.Valor;
import pe.gob.mininter.dirandro.service.ExpedienteInmuebleService;
import pe.gob.mininter.dirandro.service.InmuebleService;
import pe.gob.mininter.dirandro.service.PersonaService;
import pe.gob.mininter.dirandro.util.BeanValidar;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.util.HarecUtil;
import pe.gob.mininter.dirandro.vaadin.dialogs.AlertDialog;
import pe.gob.mininter.dirandro.vaadin.panel.util.PanelAgregarInmueble;
import pe.gob.mininter.dirandro.vaadin.util.ComboBoxLOVS;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

public class PanelRegistroParteInmueble extends CustomComponent implements ClickListener  {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */
	
	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout pnlInmuebles;
	@AutoGenerated
	private VerticalLayout pnlInmueblesBody;
	@AutoGenerated
	private Table tblInmuebles;
	@AutoGenerated
	private Button btnInmAgregar;
	@AutoGenerated
	private HorizontalLayout pnlInmueblesBody3;
	@AutoGenerated
	private ComboBoxLOVS cmbInmSituacion;
	@AutoGenerated
	private TextField txtInmNumeroPisos;
	@AutoGenerated
	private TextField txtInmTipodeUso;
	@AutoGenerated
	private ComboBox cmbInmPropietario;
	@AutoGenerated
	private HorizontalLayout lytDatos;
	@AutoGenerated
	private Label lblDatos;
	@AutoGenerated
	private HorizontalLayout pnlInmueblesBody1;
	@AutoGenerated
	private Button btnInmRegistrar;
	@AutoGenerated
	private ComboBox cmbInmInmueble;
	/**
	 * The constructor should first build the main layout, set the
	 * composition root and then do any custom initialization.
	 *
	 * The constructor will not be automatically regenerated by the
	 * visual editor.
	 */

	private static final long serialVersionUID = -4639683924066371051L;
	
	private ExpedienteInmuebleService expedienteInmuebleService;
	private PersonaService personaService;
	private InmuebleService inmuebleService;
	
	private PanelAgregarInmueble pnlAgregarInmueble;
	private Expediente expediente;
	private DetPerInmExp inmueble;
	private List<Persona> lstPersonas;
	private List<Inmueble> lstInmuebles;
	private boolean inicializado=false;
	
	public void setExpediente(Expediente expediente) {
		this.expediente = expediente;
		postConstruct();
	}

	public PanelRegistroParteInmueble() {
		buildMainLayout();
		expedienteInmuebleService = Injector.obtenerServicio(ExpedienteInmuebleService.class);
		personaService = Injector.obtenerServicio(PersonaService.class);
		inmuebleService = Injector.obtenerServicio(InmuebleService.class);
		setCompositionRoot(mainLayout);
		postConstruct();
	}
	
	public void postConstruct() {
		if(expediente!=null && !expediente.esNuevo() && !inicializado){
			limpiarDatos();
			
			lstPersonas = personaService.buscar( null );
			actualizarInmuebles(null);
			
			cmbInmSituacion.setInputPrompt("Situacion");
			cmbInmSituacion.setRequired(true);
			cmbInmSituacion.setCodigoLista(Constante.LISTA.CODIGO.SITUACION_GENERAL);
			cmbInmSituacion.attach();
			
			cmbInmInmueble.setImmediate(true);
			cmbInmInmueble.setInputPrompt("Búsquedda de inmueble por dirección");
			cmbInmInmueble.setItemCaptionPropertyId("direccion");
			cmbInmInmueble.addListener( new ValueChangeListener() {
				
				private static final long serialVersionUID = -6213576334461528840L;
				
				@Override
				public void valueChange(ValueChangeEvent event) {
					cambiaCombo( event );
				}
			});
			
			cmbInmPropietario.setInputPrompt("Propietario");
			cmbInmPropietario.setItemCaptionPropertyId("nombreCompleto");
			cmbInmPropietario.setContainerDataSource(new BeanItemContainer<Persona>(Persona.class,  lstPersonas));
			
			tblInmuebles.setSelectable(true);
			tblInmuebles.setImmediate(true);
			tblInmuebles.setNullSelectionAllowed(true);
			tblInmuebles.setNullSelectionItemId(null);
			tblInmuebles.addListener(new ValueChangeListener() {
				
				private static final long serialVersionUID = 7962790507398071986L;
	
				@Override
				public void valueChange(ValueChangeEvent event) {
					boolean esModoNuevo = tblInmuebles.getValue() == null;
					limpiar();
					habilitarEdicion(!esModoNuevo);
					if(esModoNuevo){
						tblInmuebles.setValue(null);
					}else{
						Item item = tblInmuebles.getItem(tblInmuebles.getValue());
						
						inmueble.setId((Long) item.getItemProperty("id").getValue());
						
						txtInmTipodeUso.setValue(item.getItemProperty("tipoUso").getValue());
						txtInmNumeroPisos.setValue(item.getItemProperty("pisos").getValue());
						//TODO cambiar el combo de personas para que no sea una lista porque cargara mucho al sistema
						for (Persona persona : lstPersonas) {
							if (persona.getId().equals((Long) item.getItemProperty("propietario.id").getValue())) {
								cmbInmPropietario.select(persona);
								break;
							}
						}
						for (Inmueble inmueble : lstInmuebles) {
							if (inmueble.getId().equals((Long) item.getItemProperty("inmueble.id").getValue())) {
								cmbInmInmueble.select(inmueble);
								break;
							}
						}
						cmbInmSituacion.select(new Valor( (Long) item.getItemProperty("situacion.id").getValue() ));
					}
				}
			});	
			
			btnInmAgregar.addListener((ClickListener)this);
			btnInmRegistrar.addListener((ClickListener)this);
			refrescar();
			inicializado=true;
		}
	}
	
	public void actualizarInmuebles(Inmueble inmueble){
		lstInmuebles = inmuebleService.buscar(null);
		cmbInmInmueble.setContainerDataSource(new BeanItemContainer<Inmueble>(Inmueble.class,  lstInmuebles));
		if(inmueble!=null){
			for(Inmueble inm : lstInmuebles){
				if(inm.getId().equals(inmueble.getId())){
					cmbInmInmueble.select(inm);
				}
			}
		}
	}
	
	private void cambiaCombo(ValueChangeEvent event) {
		limpiarDatos();
		if( cmbInmInmueble.getValue() != null){
			imprmirDatos((Inmueble) event.getProperty().getValue());
		}
	}
	
	private void imprmirDatos(Inmueble parSel) {
		String plantilla = "<p><b>Tipo de dirección:</b> {0} <b>Dirección:</b> {1} <b>Urbanización:</b> {2} <b>Ubicación:</b> {3}</p>";
		lytDatos.setVisible(true);
		String html = MessageFormat.format(plantilla, 
				parSel.getTipoDireccion()!=null?parSel.getTipoDireccion().getNombre():StringUtils.EMPTY, // 0
				parSel.getDireccion(), // 1
				parSel.getUrbanizacion(), // 2 
				parSel.getUbgDistrito()!=null?parSel.getUbgDistrito().getNombreCompleto():StringUtils.EMPTY
			);

		lytDatos.setVisible(true);
		lblDatos.setVisible(true);
		lblDatos.setValue(html);
	}

	private void limpiarDatos() {
		lytDatos.setVisible(false);
		lblDatos.setVisible(false);
		lblDatos.setValue("");
	}
	
	@Override
	public void buttonClick(ClickEvent event) {
		if(event.getButton().equals( btnInmRegistrar )){
			
			pnlAgregarInmueble = new PanelAgregarInmueble();
			pnlAgregarInmueble.setPadre(this);
			if(this.getParent().getParent()!=null){
				pnlAgregarInmueble.setParent(this.getParent().getParent());//cambio 1
			}else{
				pnlAgregarInmueble.setParent(this.getParent());//cambio 1	
			}
			Window window=new Window(){
				
				private static final long serialVersionUID = 1L;

				  protected void close() {
					  getApplication().getMainWindow().removeWindow(getWindow());
				  }};
			window.setCaption("Registrar Inmueble");
			window.addComponent(pnlAgregarInmueble);
			window.setModal(true);
			window.setResizable(false);
			window.setWidth("550px");
			window.setHeight("-1px");
			getApplication().getMainWindow().addWindow(window);
		}
		
		if(event.getButton().equals(btnInmAgregar)){
			
			inmueble.setNumeroPisos(!HarecUtil.nullToEmpty(txtInmNumeroPisos.getValue()).equals("") ? new BigDecimal((String)txtInmNumeroPisos.getValue()):null);
			inmueble.setInmueble((Inmueble)cmbInmInmueble.getValue());
			inmueble.setExpediente(expediente);
			inmueble.setPropietario((Persona)cmbInmPropietario.getValue());
			inmueble.setSituacion((Valor)cmbInmSituacion.getValue());
			inmueble.setTipoUso(txtInmTipodeUso.getValue().toString());
			
			HarecUtil.validar(getWindow(), inmueble, new BeanValidar[]{
				new BeanValidar("inmueble", new Object[]{"Inmueble"}, cmbInmInmueble),
				new BeanValidar("tipoUso", new Object[]{"Tipo de Uso"}, txtInmTipodeUso),
	        	new BeanValidar("situacion", new Object[]{"Situacion"}, cmbInmSituacion),
	        });
			
			if(inmueble.esNuevo()){
				expedienteInmuebleService.crear(inmueble);
			}else{
				expedienteInmuebleService.actualizar(inmueble);
			}
			
			AlertDialog alertDialog = new  AlertDialog("Registro de Inmueble", "Se ha registrado el inmueble correctamente", "Aceptar", "400");
			getApplication().getMainWindow().addWindow(alertDialog);
			refrescar();
		}
	}

	private void cargarTablaInmuebles( ){
		IndexedContainer container = new IndexedContainer();
		container.addContainerProperty("id", Long.class,  null);
		container.addContainerProperty("inmueble.id", Long.class, null);
		container.addContainerProperty("inmueble.tipoDireccion", String.class, null);
		container.addContainerProperty("inmueble.direccion", String.class, null);
		container.addContainerProperty("inmueble.urbanizacion", String.class, null);
		container.addContainerProperty("inmueble.ubicacion", String.class, null);
		container.addContainerProperty("propietario.id", Long.class, null);
		container.addContainerProperty("propietario.nombre", String.class, null);
		container.addContainerProperty("pisos", String.class, null);
		container.addContainerProperty("tipoUso", String.class, null);
		container.addContainerProperty("situacion.id", Long.class, null);
		container.addContainerProperty("situacion.nombre", String.class, null);
		
		tblInmuebles.setContainerDataSource(container);
		tblInmuebles.setVisibleColumns(new Object[]{"inmueble.direccion", "inmueble.urbanizacion", "propietario.nombre","pisos","situacion.nombre"});

		tblInmuebles.setColumnHeader("inmueble.direccion", "Direccion");
		tblInmuebles.setColumnHeader("inmueble.urbanizacion", "Urbanizacion");
		tblInmuebles.setColumnHeader("propietario.nombre", "Propietario");
		tblInmuebles.setColumnHeader("pisos", "Nro. Pisos");
		tblInmuebles.setColumnHeader("situacion.nombre", "Situacion");
		
		DetPerInmExp detinm = new DetPerInmExp();
		detinm.setExpediente(expediente);
		List<DetPerInmExp> lstinmuebles = expedienteInmuebleService.buscar(detinm);
		int con=1;
		for (DetPerInmExp inmueble : lstinmuebles){
			Item item = container.addItem(con++);
			item.getItemProperty("id").setValue(inmueble.getId());
			item.getItemProperty("inmueble.id").setValue(HarecUtil.nullToEmpty(inmueble.getInmueble().getId()));
			item.getItemProperty("inmueble.tipoDireccion").setValue((inmueble.getInmueble()!=null && inmueble.getInmueble().getTipoDireccion()!=null)?HarecUtil.nullToEmpty(inmueble.getInmueble().getTipoDireccion().getNombre()):"");
			item.getItemProperty("inmueble.direccion").setValue(inmueble.getInmueble()!=null?HarecUtil.nullToEmpty(inmueble.getInmueble().getDireccion()):"");
			item.getItemProperty("inmueble.urbanizacion").setValue(inmueble.getInmueble()!=null?HarecUtil.nullToEmpty(inmueble.getInmueble().getUrbanizacion()):"");
			item.getItemProperty("inmueble.ubicacion").setValue((inmueble.getInmueble()!=null&&inmueble.getInmueble().getUbgDistrito()!=null)?HarecUtil.nullToEmpty(inmueble.getInmueble().getUbgDistrito().getNombreCompleto()):"");
			item.getItemProperty("propietario.id").setValue(inmueble.getPropietario()!=null?HarecUtil.nullToEmpty(inmueble.getPropietario().getId()):0l);
			item.getItemProperty("propietario.nombre").setValue(inmueble.getPropietario()!=null?HarecUtil.nullToEmpty(inmueble.getPropietario().getNombreCompleto()):"");
			item.getItemProperty("pisos").setValue(HarecUtil.nullToEmpty(inmueble.getNumeroPisos()));
			item.getItemProperty("tipoUso").setValue(HarecUtil.nullToEmpty(inmueble.getTipoUso()));
			item.getItemProperty("situacion.id").setValue(inmueble.getSituacion()!=null?HarecUtil.nullToEmpty(inmueble.getSituacion().getId()):0l);
			item.getItemProperty("situacion.nombre").setValue(inmueble.getSituacion()!=null?HarecUtil.nullToEmpty(inmueble.getSituacion().getNombre()):"");
		}
	}
	
	public void refrescar(){
		habilitarEdicion(false);
		limpiar();
		cargarTablaInmuebles();
	}
	
	private void habilitarEdicion(boolean flag){
		if(flag){
			btnInmAgregar.setCaption("Actualizar Inmueble");
		}
		else{
			btnInmRegistrar.setCaption("Crear Inmueble");
		}
	}
	
	public void limpiar(){
		inmueble = new DetPerInmExp();
		inmueble.setExpediente(expediente);
		txtInmNumeroPisos.setValue("");
		txtInmTipodeUso.setValue("");
		cmbInmInmueble.select(null);
		cmbInmPropietario.select(null);
		cmbInmSituacion.select(null);
	}
	
	
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("-1px");
		
		// pnlInmuebles
		pnlInmuebles = buildPnlInmuebles();
		mainLayout.addComponent(pnlInmuebles);
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildPnlInmuebles() {
		// common part: create layout
		pnlInmuebles = new VerticalLayout();
		pnlInmuebles.setImmediate(false);
		pnlInmuebles.setWidth("-1px");
		pnlInmuebles.setHeight("-1px");
		pnlInmuebles.setMargin(false);
		
		// pnlInmueblesBody
		pnlInmueblesBody = buildPnlInmueblesBody();
		pnlInmuebles.addComponent(pnlInmueblesBody);
		
		return pnlInmuebles;
	}

	@AutoGenerated
	private VerticalLayout buildPnlInmueblesBody() {
		// common part: create layout
		pnlInmueblesBody = new VerticalLayout();
		pnlInmueblesBody.setImmediate(false);
		pnlInmueblesBody.setWidth("-1px");
		pnlInmueblesBody.setHeight("-1px");
		pnlInmueblesBody.setMargin(true);
		pnlInmueblesBody.setSpacing(true);
		
		// pnlInmueblesBody1
		pnlInmueblesBody1 = buildPnlInmueblesBody1();
		pnlInmueblesBody.addComponent(pnlInmueblesBody1);
		
		// lytDatos
		lytDatos = buildLytDatos();
		pnlInmueblesBody.addComponent(lytDatos);
		
		// pnlInmueblesBody3
		pnlInmueblesBody3 = buildPnlInmueblesBody3();
		pnlInmueblesBody.addComponent(pnlInmueblesBody3);
		
		// btnInmAgregar
		btnInmAgregar = new Button();
		btnInmAgregar.setCaption("Agregar Inmueble");
		btnInmAgregar.setImmediate(true);
		btnInmAgregar.setWidth("-1px");
		btnInmAgregar.setHeight("-1px");
		pnlInmueblesBody.addComponent(btnInmAgregar);
		pnlInmueblesBody
				.setComponentAlignment(btnInmAgregar, new Alignment(20));
		
		// tblInmuebles
		tblInmuebles = new Table();
		tblInmuebles.setImmediate(false);
		tblInmuebles.setWidth("900px");
		tblInmuebles.setHeight("-1px");
		pnlInmueblesBody.addComponent(tblInmuebles);
		pnlInmueblesBody.setComponentAlignment(tblInmuebles, new Alignment(20));
		
		return pnlInmueblesBody;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlInmueblesBody1() {
		// common part: create layout
		pnlInmueblesBody1 = new HorizontalLayout();
		pnlInmueblesBody1.setImmediate(false);
		pnlInmueblesBody1.setWidth("-1px");
		pnlInmueblesBody1.setHeight("-1px");
		pnlInmueblesBody1.setMargin(false);
		
		// cmbInmInmueble
		cmbInmInmueble = new ComboBox();
		cmbInmInmueble.setCaption("Inmueble");
		cmbInmInmueble.setImmediate(false);
		cmbInmInmueble.setWidth("350px");
		cmbInmInmueble.setHeight("-1px");
		cmbInmInmueble.setRequired(true);
		pnlInmueblesBody1.addComponent(cmbInmInmueble);
		
		// btnInmRegistrar
		btnInmRegistrar = new Button();
		btnInmRegistrar.setCaption("Registrar");
		btnInmRegistrar.setImmediate(true);
		btnInmRegistrar.setWidth("-1px");
		btnInmRegistrar.setHeight("-1px");
		pnlInmueblesBody1.addComponent(btnInmRegistrar);
		pnlInmueblesBody1.setComponentAlignment(btnInmRegistrar, new Alignment(
				9));
		
		return pnlInmueblesBody1;
	}

	@AutoGenerated
	private HorizontalLayout buildLytDatos() {
		// common part: create layout
		lytDatos = new HorizontalLayout();
		lytDatos.setImmediate(false);
		lytDatos.setWidth("-1px");
		lytDatos.setHeight("-1px");
		lytDatos.setMargin(false);
		
		// lblDatos
		lblDatos = new Label();
		lblDatos.setImmediate(false);
		lblDatos.setWidth("-1px");
		lblDatos.setHeight("-1px");
		lblDatos.setValue("Label");
		lblDatos.setContentMode(3);
		lytDatos.addComponent(lblDatos);
		
		return lytDatos;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlInmueblesBody3() {
		// common part: create layout
		pnlInmueblesBody3 = new HorizontalLayout();
		pnlInmueblesBody3.setImmediate(false);
		pnlInmueblesBody3.setWidth("-1px");
		pnlInmueblesBody3.setHeight("-1px");
		pnlInmueblesBody3.setMargin(false);
		pnlInmueblesBody3.setSpacing(true);
		
		// cmbInmPropietario
		cmbInmPropietario = new ComboBox();
		cmbInmPropietario.setCaption("Propietario");
		cmbInmPropietario.setImmediate(false);
		cmbInmPropietario.setWidth("350px");
		cmbInmPropietario.setHeight("-1px");
		pnlInmueblesBody3.addComponent(cmbInmPropietario);
		
		// txtInmTipodeUso
		txtInmTipodeUso = new TextField();
		txtInmTipodeUso.setCaption("Tipo de uso");
		txtInmTipodeUso.setImmediate(false);
		txtInmTipodeUso.setWidth("230px");
		txtInmTipodeUso.setHeight("-1px");
		txtInmTipodeUso.setRequired(true);
		txtInmTipodeUso.setInputPrompt("Tipo de Uso");
		pnlInmueblesBody3.addComponent(txtInmTipodeUso);
		
		// txtInmNumeroPisos
		txtInmNumeroPisos = new TextField();
		txtInmNumeroPisos.setCaption("Numero de pisos");
		txtInmNumeroPisos.setImmediate(false);
		txtInmNumeroPisos.setWidth("110px");
		txtInmNumeroPisos.setHeight("-1px");
		txtInmNumeroPisos.setInputPrompt("Numero de pisos");
		txtInmNumeroPisos.setMaxLength(2);
		pnlInmueblesBody3.addComponent(txtInmNumeroPisos);
		
		// cmbInmSituacion
		cmbInmSituacion = new ComboBoxLOVS();
		cmbInmSituacion.setCaption("Situación");
		cmbInmSituacion.setImmediate(false);
		cmbInmSituacion.setWidth("-1px");
		cmbInmSituacion.setHeight("-1px");
		pnlInmueblesBody3.addComponent(cmbInmSituacion);
		
		return pnlInmueblesBody3;
	}

}
